#pragma once
union Vector4;
union Vector3;
union Vector2;
union Matrix;
union Quaternion;

float operator *(Vector2&,Vector2&);
float operator *(Vector3&,Vector3&);
float operator *(Vector4&,Vector4&);

bool operator ==(Vector2&,Vector2&);
bool operator ==(Vector3&,Vector3&);
bool operator ==(Vector4&,Vector4&);
bool operator ==(Matrix&, Matrix&);

bool operator !=(Vector2&, Vector2&);
bool operator !=(Vector3&, Vector3&);
bool operator !=(Vector4&, Vector4&);
bool operator !=(Matrix&, Matrix&);

bool operator <(Vector2&, Vector2&);
bool operator <(Vector3&, Vector3&);
bool operator <(Vector4&, Vector4&);

Vector3 operator ^(Vector3&, Vector3&);

Vector2 operator +(Vector2&, Vector2&);
Vector3 operator +(Vector3&, Vector3&);
Vector4 operator +(Vector4&, Vector4&);

Vector2 operator -(Vector2&, Vector2&);
Vector3 operator -(Vector3&, Vector3&);
Vector4 operator -(Vector4&, Vector4&);

Vector2 operator -(Vector2&);
Vector3 operator -(Vector3&);
Vector4 operator -(Vector4&);

Vector2 operator *(Vector2&, float);
Vector2 operator *(float, Vector2&);

Vector3 operator *(Vector3&, float);
Vector3 operator *(float, Vector3&);

Vector4 operator *(Vector4&, float);
Vector4 operator *(float, Vector4&);

Matrix operator +(Matrix&, Matrix&);
Matrix operator -(Matrix&, Matrix&);
Matrix operator *(Matrix&, Matrix&);
Matrix operator *(Matrix&, float);
Matrix operator *(float, Matrix&);

Vector2 operator *(Vector2&, Matrix&);
Vector3 operator *(Vector3&, Matrix&);
Vector4 operator *(Vector4&, Matrix&);

float Distance(Vector2&, Vector2&);
float Distance(Vector3&, Vector3&);

Quaternion operator+(Quaternion&, Quaternion&);
Quaternion operator-(Quaternion&);
Quaternion operator-(Quaternion&, Quaternion&);
float operator*(Quaternion&, Quaternion&);
Quaternion operator*(Quaternion&, float);
Quaternion operator*(float, Quaternion&);
Quaternion operator~(Quaternion&);
